package com.hystrix;

import com.hystrix.command.CloseCommand;
import com.hystrix.command.OpenCommand;
import com.netflix.config.ConfigurationManager;
import com.netflix.hystrix.HystrixCommandMetrics;

/**
 * 请先启动当前项目的Spirng Boot
 * Created by earl on 2018/5/1.
 */
public class TestBreak{


    public static void main(String [] args) throws InterruptedException {
//        testOpen();
        tetsClose();
    }

    //测试开启断路器
    private static void testOpen() {
        //设置第一个条件阈值， 设置10秒
        ConfigurationManager.getConfigInstance().setProperty(
                "hystrix.command.default.metrics.rollingStats.timeInMilliseconds", 10000);
        //设置第一个条件阈值， 设置10个请求线程
        ConfigurationManager.getConfigInstance().setProperty(
                "hystrix.command.default.circuitBreaker.requestVolumeThreshold", 10);
        //设置第二个条件，阈值百分比超过50%
        ConfigurationManager.getConfigInstance().setProperty(
                "hystrix.command.default.circuitBreaker.errorThresholdPercentage", 50);
        for(int i = 0; i < 15; i++) {
            // 执行的命令全部都会超时
            OpenCommand c = new OpenCommand();
            c.execute();
            // 断路器打开后输出信息
            if(c.isCircuitBreakerOpen()) {
                System.out.println("断路器被打开，执行第 " + (i + 1) + " 个命令");
            }
        }

    }


    //测试关闭断路器
    public static void  tetsClose() throws InterruptedException {
        // 10秒内有3个请求就满足第一个开启断路器的条件
        ConfigurationManager.getConfigInstance().setProperty(
                "hystrix.command.default.metrics.rollingStats.timeInMilliseconds", 10000);
        ConfigurationManager.getConfigInstance().setProperty(
                "hystrix.command.default.circuitBreaker.requestVolumeThreshold", 3);
        // 请求的失败率，默认值为50%
        ConfigurationManager.getConfigInstance().setProperty(
                "hystrix.command.default.circuitBreaker.errorThresholdPercentage", 50);
        // 设置休眠期，断路器打开后，这段时间不会再执行命令，默认值为5秒，此处设置为3秒
        ConfigurationManager.getConfigInstance().setProperty(
                "hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds", 3000);
        // 该值决定是否执行超时
        boolean isTimeout = true;
        for(int i = 0; i < 10; i++) {
            // 执行的命令全部都会超时
            CloseCommand c = new CloseCommand(isTimeout);
            c.execute();
            // 输出健康状态等信息
            HystrixCommandMetrics.HealthCounts hc = c.getMetrics().getHealthCounts();
            System.out.println("断路器状态：" + c.isCircuitBreakerOpen() +
                    ", 请求总数：" + hc.getTotalRequests());
            if(c.isCircuitBreakerOpen()) {
                // 断路器打开，让下一次循环成功执行命令
                isTimeout = false;
                System.out.println("=====  断路器打开了，等待休眠期结束   =====");
                // 休眠期会在3秒后结束，此处等待4秒，确保休眠期结束
                Thread.sleep(4000);
            }
        }
    }





}
